<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>作用域链定义位置(Scope chain definition location)</title>
  <!-- 
  在JavaScript中，作用域链（Scope Chain）是指在执行上下文中，如何查找变量的过程。作用域链由多个作用域组成，形成一条链式结构，决定了在特定上下文中变量的可访问性。
  一、作用域的定义

  - 作用域（Scope）：作用域是一个上下文环境，用于定义变量的可访问性和生命周期。JavaScript中主要有三种作用域：
    - 全局作用域：在任何函数外部定义的变量和函数，属于全局作用域，可以在整个程序中访问。
    - 函数作用域：在函数内部定义的变量，属于该函数的作用域，只能在函数内部访问。
    - 块级作用域：在块（如 `if` 、 `for` 等语句）内部定义的变量，使用 `let` 和 `const` 声明时会形成块级作用域。

  二、作用域链的定义

  - 作用域链是一个结构，用于查找变量的过程。当访问一个变量时，JavaScript会按照作用域链的顺序查找该变量：
    1. 首先查找当前执行上下文的作用域。
    2. 如果在当前作用域中找不到变量，JavaScript会向外层作用域查找，直到找到变量或达到全局作用域。
    3. 如果仍然找不到变量，则会抛出 `ReferenceError` 错误。

  三、作用域链的结构

  - 作用域链的结构通常是一个嵌套的链表，包含了多个作用域的引用。每当创建一个新的函数时，都会创建一个新的作用域，并形成新的作用域链。

  总结
  - 作用域链是查找变量的机制，通过多层作用域的组合来实现。
  - 作用域链的顺序是从内到外，首先查找当前作用域，再查找外层作用域，最后查找全局作用域。
  - 理解作用域链对于掌握JavaScript的变量作用域、闭包和函数执行上下文等概念至关重要。
 -->
</head>
<body>

  <script>
    var message = "Global Message"

    function foo() {
      var name = "foo"
      setTimeout(function() {
        console.log(name, message)
      }, 3000)
    }

    foo()
    
  </script>
  
</body>
</html>